// cf-46e
// 题意：给定n行m列(n, m<=1500)个数，现在要从第i行从第一列开始连续选ci个
//       数，且保证 c1 > c2 < c3 > c4 < c5 ...
//       问最后选中数的和最大是多少。
//
// 题解：就用f[i][j]表示做了前i行，当前i行选j个，然后就转移就行，还需要
//       维护个f[i][j]的max，分奇偶从左到右或者从右到左就行。
//
// run: $exec < input
#include <cstdio>
#include <algorithm>

int const maxn = 2000;
long long const  inf = (1ll) << 44;
long long a[maxn][maxn];
long long sum[maxn][maxn];
long long f[maxn][maxn];
long long max[maxn][maxn];
int n, m;

template <class T>
void scan(T & a)
{
	a = 0;
	bool flag = false;
	char ch = std::getchar();
	if (ch == '-')
		flag = true;
	else if (ch >= '0' && ch <= '9')
		a = ch - '0';

	while ((ch = std::getchar()) >= '0' && ch <= '9')
		a = a * 10 + ch - '0';
	if (flag) a = -a;
}

int main()
{
//	std::cin >> n >> m;
	scan(n); scan(m);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++) {
//			std::cin >> a[i][j];
			scan(a[i][j]);
			sum[i][j] = sum[i][j - 1] +  a[i][j];
		}
	max[1][m + 1] = -inf;
	for (int i = m; i >= 1; i--) {
		f[1][i] = sum[1][i];
		max[1][i] = std::max(max[1][i + 1], f[1][i]);
	}
	for (int i = 2; i <= n; i++) {
		if (i & 1) {
			for (int j = 1; j <= m; j++)
				f[i][j] = sum[i][j] + max[i - 1][j - 1];
			max[i][m + 1] = -inf;
			for (int j = m; j >= 1; j--)
				max[i][j] = std::max(max[i][j + 1], f[i][j]);
		} else {
			for (int j = m; j >= 1; j--)
				f[i][j] = sum[i][j] + max[i - 1][j + 1];
			max[i][0] = -inf;
			for (int j = 1; j <= m; j++)
				max[i][j] = std::max(max[i][j - 1], f[i][j]);
		}
	}

	/*
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m + 1; j++) std::cout << max[i][j] << ' ';
		std::cout << '\n';
	}
	*/

	std::printf("%I64d\n", std::max(max[n][1], max[n][m]));
//	std::cout << std::max(max[n][1], max[n][m]) << '\n';
}

